# !/usr/bin/env python
# -*- coding: utf-8 -*-

"""
直方图描述连续型数据分布，定量
柱状图描述离散数据分布，定性
matplotlib画柱状图、条形图、直方图（包括堆积多数据并列）
https://blog.csdn.net/qq_45815776/article/details/119346872
"""
import matplotlib as mpl
import matplotlib.pyplot as plt

# 选择字体SimHei，如下完成配置任务
import numpy as np

mpl.rcParams['font.sans-serif'] = ['SimHei']
# 不使用默认‘Unicode minus’模式处理坐标轴轴线颗度标签是负数的情况，而是使用‘ASCII hyphen’模式
mpl.rcParams['axes.unicode_minus'] = False


def demo1():
    x = [1, 2, 3, 4, 5, 6, 7, 8]
    y = [3, 1, 4, 5, 8, 9, 7, 2]
    # 在x轴上绘制定性数据分布特征（柱状图）
    plt.bar(x,  # 柱状图柱体标签值
            y,  # 柱体高度
            align='center',  # 柱体对齐方式
            color='c',  # 柱体颜色
            tick_label=['q', 'w', 'e', 'r', 't', 'y', 'u', 'i'],  # 刻度标签值
            hatch='/')  # 填充样式，越密集填充就越密

    plt.xlabel("箱子编号")
    plt.ylabel("箱子重量（kg）")
    plt.show()


def demo2():
    x = [1, 2, 3, 4, 5, 6, 7, 8]
    y = [3, 1, 4, 5, 8, 9, 7, 2]
    # 在y轴上绘制定性数据分布特征（条形图）
    plt.barh(x,
             y,
             align='center',
             color='c',
             tick_label=['q', 'w', 'e', 'r', 't', 'y', 'u', 'i'],
             hatch='/')
    # 记得反过来
    plt.ylabel("箱子编号")
    plt.xlabel("箱子重量（kg）")
    plt.show()


def demo3():
    # 堆积柱状图
    x = np.arange(5)
    y = [6, 10, 4, 5, 1]
    y1 = [2, 6, 3, 8, 5]
    plt.bar(x, y, align='center', color='#66c2a5', tick_label=['A', 'B', 'C', 'D', 'E'], label='班级A')
    plt.bar(x, y1, align='center', bottom=y, color='#8da0cb', label='班级B')
    plt.xlabel('测试难度')
    plt.ylabel('试卷份数')
    plt.legend()  # 不加这个是没有label显示的！
    plt.show()


def demo4():
    # 堆积条形图
    x = np.arange(5)
    y = [6, 10, 4, 5, 1]
    y1 = [2, 6, 3, 8, 5]
    plt.barh(x, y, align='center', color='#66c2a5', tick_label=['A', 'B', 'C', 'D', 'E'], label='班级A')
    plt.barh(x, y1, align='center', bottom=y, color='#8da0cb', label='班级B')
    plt.xlabel('测试难度')
    plt.ylabel('试卷份数')
    plt.legend()  # 不加这个是没有label显示的！
    plt.show()


def demo5():
    # 多数据并列柱状图
    x = np.arange(5)
    y = [6, 10, 4, 5, 1]
    y1 = [2, 6, 3, 8, 5]
    # 多数据并列柱状图
    bar_width = 0.35
    tick_label = ['A', 'B', 'C', 'D', 'E']
    plt.bar(x, y, bar_width, align='center', color='#66c2a5', label='班级A')
    plt.bar(x + bar_width, y1, bar_width, align='center', color='#8da0cb', label='班级B')
    plt.xlabel('测试难度')
    plt.ylabel('试卷份数')
    plt.xticks(x + bar_width / 2, tick_label)
    plt.legend()
    plt.show()


def demo6():
    # 多数据并列条形图
    x = np.arange(5)
    y = [6, 10, 4, 5, 1]
    y1 = [2, 6, 3, 8, 5]
    bar_width = 0.35
    tick_label = ['A', 'B', 'C', 'D', 'E']
    plt.barh(x, y, bar_width, align='center', color='#66c2a5', label='班级A')
    plt.barh(x + bar_width, y1, bar_width, align='center', color='#8da0cb', label='班级B')
    # 这里xy的label没有换过来，图就画错了。
    plt.xlabel('测试难度')
    plt.ylabel('试卷份数')
    plt.yticks(x + bar_width / 2, tick_label)
    plt.legend()
    plt.show()


def demo7():
    # 在x轴绘制定量数据分布特征（直方图）
    # 在x轴绘制定量数据分布特征（直方图）
    boxWeight = np.random.randint(0, 10, 100)
    x = boxWeight
    bins = range(0, 11, 1)
    plt.hist(x,  # 输入连续性数据
             bins=bins,  # 柱体个数或者柱体边缘范围
             color='g',
             histtype='bar',  # 柱体类型
             rwidth=1,  # 柱体宽度
             alpha=0.6)
    plt.xlabel("箱子编号")
    plt.ylabel("箱子重量（kg）")
    plt.show()


if __name__ == '__main__':
    demo1()
    demo2()
    demo3()
    demo4()
    demo5()
    demo6()
    demo7()
